
#ifndef __U_MSG_H_
#define __U_MSG_H_



typedef struct _tag_umsg {
	struct _tag_umsg * next;
    uint16_t rsvd;
    
    uint8_t mlen;
    uint8_t type;
    uint8_t data[63];

} umsg_t;


void umsg_init( void );

static inline umsg_t * umsg_recv(void) {
  register umsg_t *pmsg __asm("r0");
  __ASM volatile("SVC #2": "=r"(pmsg) :  : "memory" );
  return pmsg;
}


/*
 * user 调用, 获得从 host 下发来的消息.
 * 执行 syscall, 进入中断状态后, 屏蔽其他中断.
 * 如果没有消息, 不会阻塞?
 */

/*
 * 执行 syscall.
 * 不会阻塞, 如果 usb buffer 满状态, 会临时构成单链表, 等待.
 */
static inline void umsg_send( umsg_t * pmsg )
{ 
    register umsg_t * xxx __asm("r0") = pmsg;
    __ASM volatile ( "SVC #3" : : "r"(xxx) : "memory" );
    return;
}



//
int umsg_inp_cbk( void * parg, uint8_t * ptr, int tmax );
int umsg_outp_cbk( void * parg, uint8_t * ptr, int tsiz );


#endif


